Data incubator application
Abstract
Please provide a general description and justification for your project. (Max 750 characters):
Climate change poses a grave threat to the planet and has become one of the biggest political and economic issues around the world. However, there is considerable uncertainty among Americans regarding climate change: 67% believe climate change is happening, barely half (53%) think it is caused by humans, and a tad more (57%) think it will harm the U.S. This is in stark contrast with other countries, of which 88% of people (the median country) believe climate change will harm their country. Addressing climate problems in the U.S. requires understanding the relationships between climate perceptions, exposure, and preparedness. I will explore these relationships and provide a web tool for explore these dimensions on an interactive map.
Problem / User:
Who is the end user for this project? What problem does it solve for them? Is the problem urgent and pervasive? Is someone willing to pay for a solution? (Max 750 characters)
Climate change itself has become a massive industry, and the U.S. Government has earmarked billions of dollars for climate mitigation and preparedness. Knowing where the these funds will be most valuable is essential maximizing return on investment. My analysis and web tool will help corporations, policy makers, and politicians understand how politics, demographics, and exposure to natural hazards affect climate preparedness. It will also policy makers identify which areas are most vulnerable due to lack of climate awareness and increasing risk. And finally it will assist with market based research for corporate branding.
Feasibility
What are the minimum requirements for this project to provide value in solving the end user’s problem? How much can be accomplished in 8 weeks? (Max 750 characters)
The minimum requirements for this project are to (a) understand the data through analytical approaches to data science and (b) build a web application allowing users to explore the data and run simple analysis online. The web application will require backend programming using R shiny. I will do this by summarizing and combining multiple datasets on climate perceptions (across 4 major categories), hazard exposure (floods, drought, wildfire), demographics (race/ethnicity, education, income), politics (support for major party candidates), and climate change preparedness. The data aggregation is done. The basic tasks of analysis and interactive web appcan be accomplished in 8 weeks. Additional tasks will depend on time – see “Impact” answer.
Data Availability
What data would you ideally have for this project? What data can you reasonably access? How do you reconcile any differences between these sets of resources? (Max 750 characters)
The ideal dataset would include climate perceptions of a sample of the U.S. population, georeferenced and with demographic data, and surveyed over time to gauge temporal trends. Such data is not available. To overcome this issue, I have compiled a dataset of climate perceptions and climate hazards across all 3,242 U.S. counties from multiple sources. Perceptions at the county-level come from the Yale Program on Climate Change Communication, weekly drought from the U.S. Drought Monitor, flood insurance claims from FEMA, wildfire risk from the Natural Hazards Index Map, and demographic and political data from the American Communities Survey and MIT Elections.
Competition
What, if any, solutions already exist for this problem? What additional value does your solution provide? (Max 750 characters)
The best available resource for climate perceptions come from the Yale Program on Climate Change Communication, which provides opinions on climate change across counties in the United States, but does not provide direct analysis nor combine with hazards or preparedness data. I was unable to locate a complete publicly available dataset containing multiple climate hazards. I have therefore had to piece together these datasets from various sources and merge them along with demographic data and a dataset on climate preparedness into a single tool for analysis and exploration.
Impact
How do you plan to validate the success of this project beyond measuring model performance? For example, how if your model “improves accuracy by 10%”, how would you contextualize the effect of this improvement to a non-technical stakeholder? (Max 750 characters)
Success of the project will be determined first and foremost by completion. Beyond that, success will be determined by the number of features available in the web app: (0) basic features including map of data, clickable counties to display count-level details, in addition to (1) a location search, (2) overall cluster analysis, (3) cluster analysis based on key features, (4) similarity search.
Visualize the data
Perceptions of climate change across U.S. counties
Perceptions of climate change vary across the united states, including considerable differences within states and among neighboring counties. There is a clear distinction in public opinion between the occurrence of climate change and the cause of climate. Importantly, this dataset was derived by researchers at Yale and George Mason from large survey of the entire U.S. (N = 12,061) combined with state- and county-level demographic data.
Reading layer `us_counties_laea' from data source `/Users/gopal/Projects/DataScience/climateviews/spatial/shp/us_counties/us_counties_laea.shp' using driver `ESRI Shapefile'
Simple feature collection with 3155 features and 2 fields
geometry type: POLYGON
dimension: XY
bbox: xmin: -2031905 ymin: -2462297 xmax: 2516293 ymax: 731649.6
epsg (SRID): NA
proj4string: +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs
Parsed with column specification:
cols(
.default = col_double(),
FIPS = [31mcol_character()[39m,
Name = [31mcol_character()[39m,
State = [31mcol_character()[39m,
wildfire_risk = [31mcol_character()[39m
)
See spec(...) for full column specifications.

Variations in partisan voting and racial diversity
Even rough inspection of the above maps by anyone familiar with American politics will likely confirm that adherence to the scientific consensus on climate depends largely on politics and demographics. Climate believers live along the coast or near the southern boarder. These are places in the U.S. with strong support for the democratic party and include diverse counties along the southern part of the country.

The observations described above are confirmed by paired plot of the raw data. Despite the differences between the first pair of maps, opinions regarding the occurrence of climate change (is it happening?) and cause of climate change (is it human-caused?) are highly correlated (R2 = 0.9392 = 0.882). Perceptions of these questions are strongly correlated with partisan voting, particularly with support for Hillary Clinton in 2016 (R2 = 0.753 for happening, and 0.714 for human) and to some extent with non-white population percentage (R2 = 0.295 for happening and 0.215 for human).
LS0tCnRpdGxlOiAiQ2xpbWF0ZSByaXNrIGFuZCBwZXJjZXB0aW9ucyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IgaW5pdCxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxyZXN1bHRzPSdoaWRlJ30KbGlicmFyeShzZikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodmlyaWRpcykKYGBgCgojIyBEYXRhIGluY3ViYXRvciBhcHBsaWNhdGlvbgoKIyMjIEFic3RyYWN0CgoqUGxlYXNlIHByb3ZpZGUgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIGFuZCBqdXN0aWZpY2F0aW9uIGZvciB5b3VyIHByb2plY3QuIChNYXggNzUwIGNoYXJhY3RlcnMpOioKCkNsaW1hdGUgY2hhbmdlIHBvc2VzIGEgZ3JhdmUgdGhyZWF0IHRvIHRoZSBwbGFuZXQgYW5kIGhhcyBiZWNvbWUgb25lIG9mIHRoZSBiaWdnZXN0IHBvbGl0aWNhbCBhbmQgZWNvbm9taWMgaXNzdWVzIGFyb3VuZCB0aGUgd29ybGQuIEhvd2V2ZXIsIHRoZXJlIGlzIGNvbnNpZGVyYWJsZSB1bmNlcnRhaW50eSBhbW9uZyBBbWVyaWNhbnMgcmVnYXJkaW5nIGNsaW1hdGUgY2hhbmdlOiA2NyUgYmVsaWV2ZSBjbGltYXRlIGNoYW5nZSBpcyBoYXBwZW5pbmcsIGJhcmVseSBoYWxmICg1MyUpIHRoaW5rIGl0IGlzIGNhdXNlZCBieSBodW1hbnMsIGFuZCBhIHRhZCBtb3JlICg1NyUpIHRoaW5rIGl0IHdpbGwgaGFybSB0aGUgVS5TLiBUaGlzIGlzIGluIHN0YXJrIGNvbnRyYXN0IHdpdGggb3RoZXIgY291bnRyaWVzLCBvZiB3aGljaCA4OCUgb2YgcGVvcGxlICh0aGUgbWVkaWFuIGNvdW50cnkpIGJlbGlldmUgY2xpbWF0ZSBjaGFuZ2Ugd2lsbCBoYXJtIHRoZWlyIGNvdW50cnkuIEFkZHJlc3NpbmcgY2xpbWF0ZSBwcm9ibGVtcyBpbiB0aGUgVS5TLiByZXF1aXJlcyB1bmRlcnN0YW5kaW5nIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gY2xpbWF0ZSBwZXJjZXB0aW9ucywgZXhwb3N1cmUsIGFuZCBwcmVwYXJlZG5lc3MuIEkgd2lsbCBleHBsb3JlIHRoZXNlIHJlbGF0aW9uc2hpcHMgYW5kIHByb3ZpZGUgYSB3ZWIgdG9vbCBmb3IgZXhwbG9yZSB0aGVzZSBkaW1lbnNpb25zIG9uIGFuIGludGVyYWN0aXZlIG1hcC4KCiMjIyBQcm9ibGVtIC8gVXNlcjoKCipXaG8gaXMgdGhlIGVuZCB1c2VyIGZvciB0aGlzIHByb2plY3Q/IFdoYXQgcHJvYmxlbSBkb2VzIGl0IHNvbHZlIGZvciB0aGVtPyBJcyB0aGUgcHJvYmxlbSB1cmdlbnQgYW5kIHBlcnZhc2l2ZT8gSXMgc29tZW9uZSB3aWxsaW5nIHRvIHBheSBmb3IgYSBzb2x1dGlvbj8gKE1heCA3NTAgY2hhcmFjdGVycykqCgpDbGltYXRlIGNoYW5nZSBpdHNlbGYgaGFzIGJlY29tZSBhIG1hc3NpdmUgaW5kdXN0cnksIGFuZCB0aGUgVS5TLiBHb3Zlcm5tZW50IGhhcyBlYXJtYXJrZWQgYmlsbGlvbnMgb2YgZG9sbGFycyBmb3IgY2xpbWF0ZSBtaXRpZ2F0aW9uIGFuZCBwcmVwYXJlZG5lc3MuIEtub3dpbmcgd2hlcmUgdGhlIHRoZXNlIGZ1bmRzIHdpbGwgYmUgbW9zdCB2YWx1YWJsZSBpcyBlc3NlbnRpYWwgbWF4aW1pemluZyByZXR1cm4gb24gaW52ZXN0bWVudC4gTXkgYW5hbHlzaXMgYW5kIHdlYiB0b29sIHdpbGwgaGVscCBjb3Jwb3JhdGlvbnMsIHBvbGljeSBtYWtlcnMsIGFuZCBwb2xpdGljaWFucyB1bmRlcnN0YW5kIGhvdyBwb2xpdGljcywgZGVtb2dyYXBoaWNzLCBhbmQgZXhwb3N1cmUgdG8gbmF0dXJhbCBoYXphcmRzIGFmZmVjdCBjbGltYXRlIHByZXBhcmVkbmVzcy4gSXQgd2lsbCBhbHNvIHBvbGljeSBtYWtlcnMgaWRlbnRpZnkgd2hpY2ggYXJlYXMgYXJlIG1vc3QgdnVsbmVyYWJsZSBkdWUgdG8gbGFjayBvZiBjbGltYXRlIGF3YXJlbmVzcyBhbmQgaW5jcmVhc2luZyByaXNrLiBBbmQgZmluYWxseSBpdCB3aWxsIGFzc2lzdCB3aXRoIG1hcmtldCBiYXNlZCByZXNlYXJjaCBmb3IgY29ycG9yYXRlIGJyYW5kaW5nLgoKIyMjIEZlYXNpYmlsaXR5CgoqV2hhdCBhcmUgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0aGlzIHByb2plY3QgdG8gcHJvdmlkZSB2YWx1ZSBpbiBzb2x2aW5nIHRoZSBlbmQgdXNlcidzIHByb2JsZW0/IEhvdyBtdWNoIGNhbiBiZSBhY2NvbXBsaXNoZWQgaW4gOCB3ZWVrcz8gKE1heCA3NTAgY2hhcmFjdGVycykqCgpUaGUgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRoaXMgcHJvamVjdCBhcmUgdG8gKGEpIHVuZGVyc3RhbmQgdGhlIGRhdGEgdGhyb3VnaCBhbmFseXRpY2FsIGFwcHJvYWNoZXMgdG8gZGF0YSBzY2llbmNlIGFuZCAoYikgYnVpbGQgYSB3ZWIgYXBwbGljYXRpb24gYWxsb3dpbmcgdXNlcnMgdG8gZXhwbG9yZSB0aGUgZGF0YSBhbmQgcnVuIHNpbXBsZSBhbmFseXNpcyBvbmxpbmUuIFRoZSB3ZWIgYXBwbGljYXRpb24gd2lsbCByZXF1aXJlIGJhY2tlbmQgcHJvZ3JhbW1pbmcgdXNpbmcgUiBzaGlueS4gSSB3aWxsIGRvIHRoaXMgYnkgc3VtbWFyaXppbmcgYW5kIGNvbWJpbmluZyBtdWx0aXBsZSBkYXRhc2V0cyBvbiBjbGltYXRlIHBlcmNlcHRpb25zIChhY3Jvc3MgNCBtYWpvciBjYXRlZ29yaWVzKSwgaGF6YXJkIGV4cG9zdXJlIChmbG9vZHMsIGRyb3VnaHQsIHdpbGRmaXJlKSwgZGVtb2dyYXBoaWNzIChyYWNlL2V0aG5pY2l0eSwgZWR1Y2F0aW9uLCBpbmNvbWUpLCBwb2xpdGljcyAoc3VwcG9ydCBmb3IgbWFqb3IgcGFydHkgY2FuZGlkYXRlcyksIGFuZCBjbGltYXRlIGNoYW5nZSBwcmVwYXJlZG5lc3MuIFRoZSBkYXRhIGFnZ3JlZ2F0aW9uIGlzIGRvbmUuIFRoZSBiYXNpYyB0YXNrcyBvZiBhbmFseXNpcyBhbmQgaW50ZXJhY3RpdmUgd2ViIGFwcGNhbiBiZSBhY2NvbXBsaXNoZWQgaW4gOCB3ZWVrcy4gQWRkaXRpb25hbCB0YXNrcyB3aWxsIGRlcGVuZCBvbiB0aW1lIC0tIHNlZSAiSW1wYWN0IiBhbnN3ZXIuCgojIyMgRGF0YSBBdmFpbGFiaWxpdHkKCipXaGF0IGRhdGEgd291bGQgeW91IGlkZWFsbHkgaGF2ZSBmb3IgdGhpcyBwcm9qZWN0PyBXaGF0IGRhdGEgY2FuIHlvdSByZWFzb25hYmx5IGFjY2Vzcz8gSG93IGRvIHlvdSByZWNvbmNpbGUgYW55IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlc2Ugc2V0cyBvZiByZXNvdXJjZXM/IChNYXggNzUwIGNoYXJhY3RlcnMpKgoKVGhlIGlkZWFsIGRhdGFzZXQgd291bGQgaW5jbHVkZSBjbGltYXRlIHBlcmNlcHRpb25zIG9mIGEgc2FtcGxlIG9mIHRoZSBVLlMuIHBvcHVsYXRpb24sIGdlb3JlZmVyZW5jZWQgYW5kIHdpdGggZGVtb2dyYXBoaWMgZGF0YSwgYW5kIHN1cnZleWVkIG92ZXIgdGltZSB0byBnYXVnZSB0ZW1wb3JhbCB0cmVuZHMuIFN1Y2ggZGF0YSBpcyBub3QgYXZhaWxhYmxlLiBUbyBvdmVyY29tZSB0aGlzIGlzc3VlLCBJIGhhdmUgY29tcGlsZWQgYSBkYXRhc2V0IG9mIGNsaW1hdGUgcGVyY2VwdGlvbnMgYW5kIGNsaW1hdGUgaGF6YXJkcyBhY3Jvc3MgYWxsIDMsMjQyIFUuUy4gY291bnRpZXMgZnJvbSBtdWx0aXBsZSBzb3VyY2VzLiBQZXJjZXB0aW9ucyBhdCB0aGUgY291bnR5LWxldmVsIGNvbWUgZnJvbSB0aGUgWWFsZSBQcm9ncmFtIG9uIENsaW1hdGUgQ2hhbmdlIENvbW11bmljYXRpb24sIHdlZWtseSBkcm91Z2h0IGZyb20gdGhlIFUuUy4gRHJvdWdodCBNb25pdG9yLCBmbG9vZCBpbnN1cmFuY2UgY2xhaW1zIGZyb20gRkVNQSwgd2lsZGZpcmUgcmlzayBmcm9tIHRoZSBOYXR1cmFsIEhhemFyZHMgSW5kZXggTWFwLCBhbmQgZGVtb2dyYXBoaWMgYW5kIHBvbGl0aWNhbCBkYXRhIGZyb20gdGhlIEFtZXJpY2FuIENvbW11bml0aWVzIFN1cnZleSBhbmQgTUlUIEVsZWN0aW9ucy4KCiMjIyBDb21wZXRpdGlvbgoKKldoYXQsIGlmIGFueSwgc29sdXRpb25zIGFscmVhZHkgZXhpc3QgZm9yIHRoaXMgcHJvYmxlbT8gV2hhdCBhZGRpdGlvbmFsIHZhbHVlIGRvZXMgeW91ciBzb2x1dGlvbiBwcm92aWRlPyAoTWF4IDc1MCBjaGFyYWN0ZXJzKSoKClRoZSBiZXN0IGF2YWlsYWJsZSByZXNvdXJjZSBmb3IgY2xpbWF0ZSBwZXJjZXB0aW9ucyBjb21lIGZyb20gdGhlIFlhbGUgUHJvZ3JhbSBvbiBDbGltYXRlIENoYW5nZSBDb21tdW5pY2F0aW9uLCB3aGljaCBwcm92aWRlcyBvcGluaW9ucyBvbiBjbGltYXRlIGNoYW5nZSBhY3Jvc3MgY291bnRpZXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGRpcmVjdCBhbmFseXNpcyBub3IgY29tYmluZSB3aXRoIGhhemFyZHMgb3IgcHJlcGFyZWRuZXNzIGRhdGEuIEkgd2FzIHVuYWJsZSB0byBsb2NhdGUgYSBjb21wbGV0ZSBwdWJsaWNseSBhdmFpbGFibGUgZGF0YXNldCBjb250YWluaW5nIG11bHRpcGxlIGNsaW1hdGUgaGF6YXJkcy4gSSBoYXZlIHRoZXJlZm9yZSBoYWQgdG8gcGllY2UgdG9nZXRoZXIgdGhlc2UgZGF0YXNldHMgZnJvbSB2YXJpb3VzIHNvdXJjZXMgYW5kIG1lcmdlIHRoZW0gYWxvbmcgd2l0aCBkZW1vZ3JhcGhpYyBkYXRhIGFuZCBhIGRhdGFzZXQgb24gY2xpbWF0ZSBwcmVwYXJlZG5lc3MgaW50byBhIHNpbmdsZSB0b29sIGZvciBhbmFseXNpcyBhbmQgZXhwbG9yYXRpb24uCgojIyMgSW1wYWN0CgoqSG93IGRvIHlvdSBwbGFuIHRvIHZhbGlkYXRlIHRoZSBzdWNjZXNzIG9mIHRoaXMgcHJvamVjdCBiZXlvbmQgbWVhc3VyaW5nIG1vZGVsIHBlcmZvcm1hbmNlPyBGb3IgZXhhbXBsZSwgaG93IGlmIHlvdXIgbW9kZWwgImltcHJvdmVzIGFjY3VyYWN5IGJ5IDEwJSIsIGhvdyB3b3VsZCB5b3UgY29udGV4dHVhbGl6ZSB0aGUgZWZmZWN0IG9mIHRoaXMgaW1wcm92ZW1lbnQgdG8gYSBub24tdGVjaG5pY2FsIHN0YWtlaG9sZGVyPyAoTWF4IDc1MCBjaGFyYWN0ZXJzKSoKClN1Y2Nlc3Mgb2YgdGhlIHByb2plY3Qgd2lsbCBiZSBkZXRlcm1pbmVkIGZpcnN0IGFuZCBmb3JlbW9zdCBieSBjb21wbGV0aW9uLiBCZXlvbmQgdGhhdCwgc3VjY2VzcyB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIG51bWJlciBvZiBmZWF0dXJlcyBhdmFpbGFibGUgaW4gdGhlIHdlYiBhcHA6ICgwKSBiYXNpYyBmZWF0dXJlcyBpbmNsdWRpbmcgbWFwIG9mIGRhdGEsIGNsaWNrYWJsZSBjb3VudGllcyB0byBkaXNwbGF5IGNvdW50LWxldmVsIGRldGFpbHMsIGluIGFkZGl0aW9uIHRvICgxKSBhIGxvY2F0aW9uIHNlYXJjaCwgKDIpIG92ZXJhbGwgY2x1c3RlciBhbmFseXNpcywgKDMpIGNsdXN0ZXIgYW5hbHlzaXMgYmFzZWQgb24ga2V5IGZlYXR1cmVzLCAoNCkgc2ltaWxhcml0eSBzZWFyY2guCgojIyBCYWNrZ3JvdW5kCgpJdCdzIHdlbGwgZG9jdW1lbnRlZCB0aGF0IGNsaW1hdGUgcGVyY2VwdGlvbnMgd2l0aGluIHRoZSBVbml0ZWQgU3RhdGVzIGFyZSBpbmZsdWVuY2VkIHRvIGEgbGFyZ2UgZGVncmVlIGJ5IHBvbGl0aWNhbCBpZGVvbG9neSBhbmQgcGFydHkgYWZmaWxpYXRpb24uIEZvciBpbnN0YW5jZToKCiogRnVsbCAyMDE2IHJlcG9ydCBmcm9tIFtQRVddKGh0dHBzOi8vd3d3LnBld3Jlc2VhcmNoLm9yZy9zY2llbmNlLzIwMTYvMTAvMDQvcHVibGljLXZpZXdzLW9uLWNsaW1hdGUtY2hhbmdlLWFuZC1jbGltYXRlLXNjaWVudGlzdHMvKQoqIHNlZSBbUEVXIGNsaW1hdGUgcGVyY2VwdGlvbnMgVVNBXShodHRwczovL3d3dy5wZXdyZXNlYXJjaC5vcmcvc2NpZW5jZS8yMDE5LzExLzI1L3Utcy1wdWJsaWMtdmlld3Mtb24tY2xpbWF0ZS1hbmQtZW5lcmd5LykKKiBJbmNyZWFzaW5nIGNsaW1hdGUgYXdhcmVuZXNzIGlzIG9jY3VycmluZyBbbW9zdGx5IGFtb25nIGRlbW9jcmF0c10oaHR0cHM6Ly93d3cucGV3cmVzZWFyY2gub3JnL2ZhY3QtdGFuay8yMDE5LzA4LzI4L3Utcy1jb25jZXJuLWFib3V0LWNsaW1hdGUtY2hhbmdlLWlzLXJpc2luZy1idXQtbWFpbmx5LWFtb25nLWRlbW9jcmF0cy8pCiogWW91bmcgcmVwdWJsaWNhbnMgW3dhbnQgY2xpbWF0ZSBhY3Rpb25dKGh0dHBzOi8vd3d3LnZveC5jb20vMjAxOS8xMS8yNS8yMDk4MTc2OC9jbGltYXRlLWNoYW5nZS1wZXctb3Bpbmlvbi1wb2xsLXJlcHVibGljYW5zLW9rLWJvb21lcikKKiBbS2FtYXJrIChCcm9va2luZ3MpLCAyMDE5XShodHRwczovL3d3dy5icm9va2luZ3MuZWR1L3Jlc2VhcmNoL3RoZS1jaGFsbGVuZ2luZy1wb2xpdGljcy1vZi1jbGltYXRlLWNoYW5nZS8pCiogW0dyYXkgZXQgYWwuLCAyMDE5XShodHRwczovL3d3dy5zY2llbmNlZGlyZWN0LmNvbS9zY2llbmNlL2FydGljbGUvcGlpL1MyMjE0NjI5NjE5MzAxMjI3KS4KKiBDbGltYXRlIHBlcmNlcHRpb25zIHZhcnkgYWNyb3NzIGxvY2FsIHNjYWxlcyBpbiB0aGUgVVMsIGFjY29yZGluZyB0byBhIHJlY2VudCBbcGFwZXIgaW4gTmF0dXJlIENsaW1hdGVdKGh0dHBzOi8vd3d3Lm5hdHVyZS5jb20vYXJ0aWNsZXMvbmNsaW1hdGUyNTgzKSB3aGljaCBwdWJsaXNoZWQgYSBsYXJnZSBkYXRhc2V0IG9uIGNsaW1hdGUgcGVyY2VwdGlvbnMgd2l0aGluIHRoZSBVUy4KCgojIyBEYXRhIHdyYW5nbGVkIGFuZCBjb21iaW5lZAoKRGF0YXNldHMgSSBoYXZlIGRvd25sb2FkZWQsIGNsZWFuZWQsIGFuZCBqb2luZWQgYXQgdGhlIFVTIGNvdW50eSBsZXZlbDoKCiogQ291bnR5LWxldmVsIEZJUFMgY29kZXMgc2NyYXBlZCBmcm9tIFtVU0RBXShodHRwczovL3d3dy5ucmNzLnVzZGEuZ292L3dwcy9wb3J0YWwvbnJjcy9kZXRhaWwvbmF0aW9uYWwvaG9tZS8/Y2lkPW5yY3MxNDNfMDEzNjk3KSAoPDEgTUIpCiogQ2xpbWF0ZSBwZXJjZXB0aW9ucyBbWUNPTV0oaHR0cHM6Ly9jbGltYXRlY29tbXVuaWNhdGlvbi55YWxlLmVkdS92aXN1YWxpemF0aW9ucy1kYXRhL3ljb20tdXMvKSAoMiBNQikKICAgICsgWWFsZSBjbGltYXRlIGNoYW5nZSBwZXJjZXB0aW9ucyBkYXRhYmFzZSBhdCB0aGUgY291bnR5IGxldmVsCiAgICArIFN1cnZleSBxdWVzdGlvbnMgKGdpdmVuIHRvIE4gPSAxMiwwNjEgcGFydGljaXBhbnRzKSBzZXBhcmF0ZWQgaW50byBjYXRlZ29yaWVzOgogICAgICAgICsgQmVsaWVmcwogICAgICAgICsgUmlzayBwZXJjZXB0aW9ucwogICAgICAgICsgUG9saWN5IHN1cHBvcnQKICAgICAgICArIEJlaGF2aW9yCiAgICArIFRoaXMgZGF0YWJhc2Ugd2FzIGNvbXBpbGVkIHVzaW5nIG11bHRpbGV2ZWwgcmVncmVzc2lvbiArIHBvc3RzdHJhdGlmaWNhdGlvbgogICAgKyBFYWNoIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgYSBsb2dpdCBtb2RlbCBhY2NvdW50aW5nIGZvciBkZW1vZ3JhcGhpY3MKICAgICsgQ291bnR5LWxldmVsIHBvc3RzdHJhdGlmaWNhdGlvbiB3YXMgZG9uZSB1c2luZyBkZW1vZ3JhcGhpY3MsIGdlb2dyYXBoeSwgYW5kIGEgY291cGxlIG9mIGNsaW1hdGUgcHJveGllcyBzdWNoIGFzIDIwMDggT2JhbWEgdm90ZSBzaGFyZSwgc2FtZS1zZXggaG91c2Vob2xkcywgZHJpdmVycyB3aG8gZHJpdmUgYWxvbmUsIGFuZCBwZXIgY2FwaXRhIGNhcmJvbiBmb290cHJpbnQKKiBXaWxkZmlyZSBoYXphcmQgbGV2ZWwgW05hdHVyYWwgSGF6YXJkcyBJbmRleCBNYXAgKEVhcnRoIEluc3RpdHV0ZSBhdCBDb2x1bWJpYSldKGh0dHBzOi8vbmNkcC5jb2x1bWJpYS5lZHUvbGlicmFyeS9tYXBzbWFwcGluZy1wcm9qZWN0cy91cy1uYXR1cmFsLWhhemFyZHMtaW5kZXgvKSAoPDEgTUIpCiogW01JVCBlbGVjdGlvbnMgZGF0YV0oaHR0cHM6Ly9lbGVjdGlvbmxhYi5taXQuZWR1L2RhdGEpLCBlc3BlY2lhbGx5IFt0aGlzIGRhdGFzZXQgZnJvbSAyMDE4XShodHRwczovL2dpdGh1Yi5jb20vTUVEU0wvMjAxOC1lbGVjdGlvbnMtdW5vZmZpY2FsKSAoMSBNQikKKiBbVVMgRHJvdWdodCBNb25pdG9yXShodHRwczovL2Ryb3VnaHRtb25pdG9yLnVubC5lZHUvRGF0YS9EYXRhRG93bmxvYWQvQ29tcHJlaGVuc2l2ZVN0YXRpc3RpY3MuYXNweCksIGFuZCBbQVBJIGluZm9dKGh0dHBzOi8vZHJvdWdodG1vbml0b3IudW5sLmVkdS9XZWJTZXJ2aWNlSW5mby5hc3B4I2NvbXApICgyOTIgTUIpCiogW0ZFTUEgTkZJUF0oaHR0cHM6Ly93d3cuZmVtYS5nb3YvbWVkaWEtbGlicmFyeS9hc3NldHMvZG9jdW1lbnRzLzE4MDM3NCkgKDU0MyBNQikKKiBTZXZlcmUgYW5kIHN1cGVyIHNldmVyZSBkaXNhc3RlcnMgYnkgY291bnR5LCAxOTMwLTIwMTAgW0JvdXN0YW4gZXQgYWxdKGh0dHBzOi8vdGhlY29udmVyc2F0aW9uLmNvbS9uZXctZGF0YS1zZXQtZXhwbG9yZXMtOTAteWVhcnMtb2YtbmF0dXJhbC1kaXNhc3RlcnMtaW4tdGhlLXVzLTc4MzgyKQoKPCEtLSBOb3QgY3VycmVudGx5IGluY2x1ZGVkOiAtLT4KCjwhLS0gKiBQb3RlbnRpYWxseSwgdGhlIFtBbWVyaWNhbiBDb21tdW5pdGllcyBTdXJ2ZXldKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvYWNzL3d3dy9kYXRhL2RhdGEtdGFibGVzLWFuZC10b29scy8pLCBidXQgdGhpcyBtYXkgYmUgdW5uZWNlc3NhcnkgLS0+CjwhLS0gKiBOT1QgVVNFRDogRkVNQSBuYXR1cmFsIGRpc2FzdGVycyBkYXRhYmFzZSwgWzE5NTMtMjAyMF0oaHR0cHM6Ly93d3cuZmVtYS5nb3Yvb3BlbmZlbWEtZGF0YXNldC1kaXNhc3Rlci1kZWNsYXJhdGlvbnMtc3VtbWFyaWVzLXYxKSAob3IsIFtkYXRhIHRocm91Z2ggMjAxM10oaHR0cHM6Ly93d3cuZmVtYS5nb3YvZGF0YS1zZXRzKSBjb250YWlucyBGSVBTKSAtLT4KCjwhLS0gRWFjaCBvZiB0aGUgZGF0YXNldHMgbXVjaCBiZSBqb2luZWQgYXQgdGhlIGNvdW50eSBsZXZlbCwgd2hpY2ggcmVxdWlyZXMgYSBtaW5pbWFsIGFtb3VudCBvZiBjbGVhbmluZyBhbmQgcHJlcGFyYXRpb24gKGUuZy4sIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSB0ZXh0IGluIGNvdW50eSBJRCBmaWVsZHMpLiBJIHdpbGwgY29udmVydCBtYWluIGRhdGFzZXQgb2YgY2xpbWF0ZSBwZXJjZXB0aW9ucyAoWUNPTSkgdG8gcHJpbmNpcGxlIGNvbXBvbmVudHMsIGZvciBlYWNoIG9mIHRoZSBtYWpvciBzdWJqZWN0IGFyZWFzIG9mIHRoZSBzdXJ2ZXkuIC0tPgoKIyMgVmlzdWFsaXplIHRoZSBkYXRhCgojIyMgUGVyY2VwdGlvbnMgb2YgY2xpbWF0ZSBjaGFuZ2UgYWNyb3NzIFUuUy4gY291bnRpZXMKClBlcmNlcHRpb25zIG9mIGNsaW1hdGUgY2hhbmdlIHZhcnkgYWNyb3NzIHRoZSB1bml0ZWQgc3RhdGVzLCBpbmNsdWRpbmcgY29uc2lkZXJhYmxlIGRpZmZlcmVuY2VzIHdpdGhpbiBzdGF0ZXMgYW5kIGFtb25nIG5laWdoYm9yaW5nIGNvdW50aWVzLiBUaGVyZSBpcyBhIGNsZWFyIGRpc3RpbmN0aW9uIGluIHB1YmxpYyBvcGluaW9uIGJldHdlZW4gdGhlIG9jY3VycmVuY2Ugb2YgY2xpbWF0ZSBjaGFuZ2UgYW5kIHRoZSBjYXVzZSBvZiBjbGltYXRlLiBJbXBvcnRhbnRseSwgdGhpcyBkYXRhc2V0IHdhcyBkZXJpdmVkIGJ5IHJlc2VhcmNoZXJzIGF0IFlhbGUgYW5kIEdlb3JnZSBNYXNvbiBmcm9tIGxhcmdlIHN1cnZleSBvZiB0aGUgZW50aXJlIFUuUy4gKE4gPSAxMiwwNjEpIGNvbWJpbmVkIHdpdGggc3RhdGUtIGFuZCBjb3VudHktbGV2ZWwgZGVtb2dyYXBoaWMgZGF0YS4KCmBgYHtyIHljb21fbWFwLGVjaG89RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NH0KdXNfY291bnRpZXMgPC0gc2Y6OnN0X3JlYWQoIi4uLy4uL3NwYXRpYWwvc2hwL3VzX2NvdW50aWVzL3VzX2NvdW50aWVzX2xhZWEuc2hwIikKZGF0YSA8LSByZWFkX2NzdigiLi4vLi4vcmVzdWx0cy9vdXRwdXQvaW5jdWJhdG9yX2RhdGEuY3N2IikKdXNfY291bnRpZXNfZGF0YSA8LSB1c19jb3VudGllcyAlPiUgbGVmdF9qb2luKGRhdGEsYnk9ImZpcHMiKQoKIyBwIDwtIHBsb3RseTo6Z2dwbG90bHkoCnBfeWNvbSA8LSBnZ3Bsb3QoKSArIAogIGdlb21fc2YoZGF0YT11c19jb3VudGllc19kYXRhICU+JSBzZWxlY3QoYElzIGNsaW1hdGUgY2hhbmdlIGhhcGVuaW5nP2A9aGFwcGVuaW5nLGBJcyBpdCBjYXVzZWQgYnkgaHVtYW5zP2A9aHVtYW4pICU+JSBnYXRoZXIodmFyaWFibGUscGVyY2VudCwtZ2VvbWV0cnkpLGFlcyhmaWxsPXBlcmNlbnQpLGNvbG9yPU5BKSArCiAgdmlyaWRpczo6c2NhbGVfZmlsbF92aXJpZGlzKCJQZXJjZW50IG9mXG5wb3B1bGF0aW9uIikgKwogIGZhY2V0X3dyYXAofnZhcmlhYmxlLG5yb3c9MSkgKwogIGxhYnMoY2FwdGlvbj0iRGF0YTogWWFsZSBQcm9ncmFtIG9uIENsaW1hdGUgQ2hhbmdlIENvbW11bmljYXRpb24gKGNsaW1hdGVjb21tdW5pY2F0aW9uLnlhbGUuZWR1KSIpICsKICBnZ3RpdGxlKCJQZXJjZXB0aW9ucyBvZiBjbGltYXRlIGNoYW5nZSBhY3Jvc3MgdGhlIFVuaXRlZCBTdGF0ZXMgKDMsMTQyIGNvdW50aWVzKSIpICsKICB0aGVtZShzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTExKSxwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KHNpemU9MTApKQogICMgKQpwcmludChwX3ljb20pCmBgYAoKIyMjIFZhcmlhdGlvbnMgaW4gcGFydGlzYW4gdm90aW5nIGFuZCByYWNpYWwgZGl2ZXJzaXR5CgpFdmVuIHJvdWdoIGluc3BlY3Rpb24gb2YgdGhlIGFib3ZlIG1hcHMgYnkgYW55b25lIGZhbWlsaWFyIHdpdGggQW1lcmljYW4gcG9saXRpY3Mgd2lsbCBsaWtlbHkgY29uZmlybSB0aGF0IGFkaGVyZW5jZSB0byB0aGUgc2NpZW50aWZpYyBjb25zZW5zdXMgb24gY2xpbWF0ZSBkZXBlbmRzIGxhcmdlbHkgb24gcG9saXRpY3MgYW5kIGRlbW9ncmFwaGljcy4gQ2xpbWF0ZSBiZWxpZXZlcnMgbGl2ZSBhbG9uZyB0aGUgY29hc3Qgb3IgbmVhciB0aGUgc291dGhlcm4gYm9hcmRlci4gVGhlc2UgYXJlIHBsYWNlcyBpbiB0aGUgVS5TLiB3aXRoIHN0cm9uZyBzdXBwb3J0IGZvciB0aGUgZGVtb2NyYXRpYyBwYXJ0eSBhbmQgaW5jbHVkZSBkaXZlcnNlIGNvdW50aWVzIGFsb25nIHRoZSBzb3V0aGVybiBwYXJ0IG9mIHRoZSBjb3VudHJ5LgoKYGBge3IgbWl0X21hcCxlY2hvPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9CnBfbWl0IDwtIGdncGxvdCgpICsgCiAgZ2VvbV9zZihkYXRhPXVzX2NvdW50aWVzX2RhdGEgJT4lIG11dGF0ZSgpICU+JSAKICAgICAgICAgICAgc2VsZWN0KGBIaWxsYXJ5IG1ham9yLXBhcnR5IHZvdGUgc2hhcmUgaW4gMjAxNmA9Y2xpbnRvbjE2LAogICAgICAgICAgICAgICAgICAgYE5vbi13aGl0ZSBwb3B1bGF0aW9uYD1ub253aGl0ZSkgJT4lICMsYFBvcHVsYXRpb24gaW4gdXJiYW4gYXJlYXNgPXVyYmFuX3BjdCkgJT4lIAogICAgICAgICAgICBnYXRoZXIodmFyaWFibGUscGVyY2VudCwtZ2VvbWV0cnkpLGFlcyhmaWxsPXBlcmNlbnQpLGNvbG9yPU5BKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIoIlBlcmNlbnQgb2ZcbnZvdGVzIG9yXG5wb3B1bGF0aW9uIixtaWRwb2ludD01MCxsaW1pdHM9YygwLDEwMCkpICsKICAjIHZpcmlkaXM6OnNjYWxlX2ZpbGxfdmlyaWRpcygiUGVyY2VudCBvZlxudm90ZXMgb3JcbnBvcHVsYXRpb24iKSArCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUsbnJvdz0xKSArCiAgbGFicyhjYXB0aW9uPSJEYXRhOiBNSVQgRWxlY3Rpb24gRGF0YSAoZWxlY3Rpb25sYWIubWl0LmVkdS9kYXRhKSIpICsKICBnZ3RpdGxlKHBhc3RlMCgiRGVtb2dyYXBoaWNzIGFzIGVsZWN0aW9uIHJldHVybnMgYW5kIHVyYmFuLXJ1cmFsIGRpdmlkZSAoIiwKICAgICAgICAgICAgICAgICBmb3JtYXQoc3VtKCFpcy5uYSh1c19jb3VudGllc19kYXRhJGNsaW50b24xNikpLGJpZy5tYXJrPSIsIiksIiBjb3VudGllcykiKSkgKwogIHRoZW1lKHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTEpLHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoc2l6ZT0xMCkpCnByaW50KHBfbWl0KQpgYGAKClRoZSBvYnNlcnZhdGlvbnMgZGVzY3JpYmVkIGFib3ZlIGFyZSBjb25maXJtZWQgYnkgcGFpcmVkIHBsb3Qgb2YgdGhlIHJhdyBkYXRhLiBEZXNwaXRlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBmaXJzdCBwYWlyIG9mIG1hcHMsIG9waW5pb25zIHJlZ2FyZGluZyB0aGUgb2NjdXJyZW5jZSBvZiBjbGltYXRlIGNoYW5nZSAoaXMgaXQgKmhhcHBlbmluZyo/KSBhbmQgY2F1c2Ugb2YgY2xpbWF0ZSBjaGFuZ2UgKGlzIGl0ICpodW1hbiotY2F1c2VkPykgYXJlIGhpZ2hseSBjb3JyZWxhdGVkIChSXjJeID0gMC45MzleMl4gPSBgciByb3VuZCgwLjkzOV4yLDMpYCkuIFBlcmNlcHRpb25zIG9mIHRoZXNlIHF1ZXN0aW9ucyBhcmUgc3Ryb25nbHkgY29ycmVsYXRlZCB3aXRoIHBhcnRpc2FuIHZvdGluZywgcGFydGljdWxhcmx5IHdpdGggc3VwcG9ydCBmb3IgSGlsbGFyeSBDbGludG9uIGluIDIwMTYgKFJeMl4gPSBgciByb3VuZCgwLjg2OF4yLDMpYCBmb3IgKmhhcHBlbmluZyosIGFuZCBgciByb3VuZCgwLjg0NV4yLDMpYCBmb3IgKmh1bWFuKikgYW5kIHRvIHNvbWUgZXh0ZW50IHdpdGggbm9uLXdoaXRlIHBvcHVsYXRpb24gcGVyY2VudGFnZSAoUl4yXiA9IGByIHJvdW5kKDAuNTQzXjIsMylgIGZvciAqaGFwcGVuaW5nKiBhbmQgYHIgcm91bmQoMC40NjReMiwzKWAgZm9yICpodW1hbiopLgoKYGBge3IgcGFpcnBsb3RzLGVjaG89RkFMU0UsZmlnLndpZHRoPTYsZmlnLmhlaWdodD00LG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0KIyBjb3VudHlfZGF0YSA8LSB5Y29tX2NvdW50eSAlPiUgbGVmdF9qb2luKG1pdF9jb3VudHksYnk9ImZpcHMiKQojIGNvdW50eV9kYXRhX3NlbGVjdCA8LSBjb3VudHlfZGF0YSAlPiUgc2VsZWN0KGhhcHBlbmluZyxodW1hbixvYmFtYTEyX3BjdCxjbGludG9uMTZfcGN0LG5vbndoaXRlX3BjdCkKIyBjb3VudHlfZGF0YV9zZWxlY3RfbG9uZyA8LSBjb3VudHlfZGF0YV9zZWxlY3QgJT4lIAojICAgZ2F0aGVyKHljb21fdmFyLHljb21fcGN0LGhhcHBlbmluZyxodW1hbikgJT4lIAojICAgZ2F0aGVyKG1pdF92YXIsbWl0X3BjdCxvYmFtYTEyX3BjdDpub253aGl0ZV9wY3QpCiMgCiMgcF9wYWlycyA8LSBnZ3Bsb3QoY291bnR5X2RhdGFfc2VsZWN0X2xvbmcpICsgZ2VvbV9wb2ludChhZXMobWl0X3BjdCx5Y29tX3BjdCkpICsKIyAgIGZhY2V0X2dyaWQoeWNvbV92YXJ+bWl0X3Zhcixzd2l0Y2ggPSAiYm90aCIpICsKIyAgIGxhYnMoY2FwdGlvbj0iQ29ycmVsYXRpb25zIGFtb25nIGRhdGEuIikKIyAgIHRoZW1lKHN0cmlwLnBsYWNlbWVudCA9ICJvdXRzaWRlIiwKIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTExKSwKIyAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD1OQSxjb2xvcj1OQSkpCiMgcHJpbnQocF9wYWlycykKIyBwX3BhaXJzIDwtIEdHYWxseTo6Z2dwYWlycyhjb3VudHlfZGF0YV9zZWxlY3QgJT4lIG5hLm9taXQoKSkKIyBwX3BhaXJzCmBgYAoKIyMgRXhwb3N1cmUgdG8gZW52aXJvbm1lbnRhbCBoYXphcmRzCgpgYGB7ciBkcm91Z2h0X21hcCxlY2hvPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTIuNX0KcF9kcm91Z2h0IDwtIGdncGxvdCgpICsgCiAgZ2VvbV9zZihkYXRhPXVzX2NvdW50aWVzX2RhdGEgJT4lIG11dGF0ZSgpICU+JSAKICAgICAgICAgICAgc2VsZWN0KGBEMTogTW9kZXJhdGUgZHJvdWdodGA9RDFfcGN0X21lYW4sCiAgICAgICAgICAgICAgICAgICBgRDI6IFNldmVyZSBkcm91Z2h0YD1EMl9wY3RfbWVhbiwKICAgICAgICAgICAgICAgICAgIGBEMzogRXh0cmVtZSBkcm91Z2h0YD1EM19wY3RfbWVhbiwKICAgICAgICAgICAgICAgICAgIGBENDogRXhjZXB0aW9uYWwgZHJvdWdodGA9RDRfcGN0X21lYW4pICU+JSAjLGBQb3B1bGF0aW9uIGluIHVyYmFuIGFyZWFzYD11cmJhbl9wY3QpICU+JSAKICAgICAgICAgICAgZ2F0aGVyKHZhcmlhYmxlLHBlcmNlbnQsLWdlb21ldHJ5KSxhZXMoZmlsbD1wZXJjZW50KSxjb2xvcj1OQSkgKwogIHZpcmlkaXM6OnNjYWxlX2ZpbGxfdmlyaWRpcygiUGVyY2VudFxub2YgZGF5c1xuaW4gZHJvdWdodCIsb3B0aW9uPSJtYWdtYSIpICsKICBmYWNldF93cmFwKH52YXJpYWJsZSxucm93PTEpICsKICBsYWJzKGNhcHRpb249IkRhdGE6IFVTIERyb3VnaHQgTW9uaXRvciAoZHJvdWdodG1vbml0b3IudW5sLmVkdSkiKSArCiAgZ2d0aXRsZShwYXN0ZTAoIlBlcmNlbnQgdGltZSBzcGVudCBpbiBkcm91Z2h0LCAyMDEwLTIwMTkgKCIsCiAgICAgICAgICAgICAgICAgZm9ybWF0KHN1bSghaXMubmEodXNfY291bnRpZXNfZGF0YSREMV9wY3RfbWVhbikpLGJpZy5tYXJrPSIsIiksIiBjb3VudGllcykiKSkgKwogIHRoZW1lKHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTEpLHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoc2l6ZT0xMCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfYmxhbmsoKSxheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKQpwcmludChwX2Ryb3VnaHQpCmBgYAoKCmBgYHtyIGZsb29kX21hcCxlY2hvPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9CnBfZmxvb2QgPC0gZ2dwbG90KCkgKyAKICBnZW9tX3NmKGRhdGE9dXNfY291bnRpZXNfZGF0YSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShhbW91bnRfMjAwMHM9bG9nMTAoYW1vdW50XzIwMDBzL1RvdGFsUG9wKSwKICAgICAgICAgICAgICAgICAgIGFtb3VudF8yMDEwcz1sb2cxMChhbW91bnRfMjAxMHMvVG90YWxQb3ApKSAlPiUKICAgICAgICAgICAgbXV0YXRlKGFtb3VudF8yMDAwcz1pZl9lbHNlKGlzLm5hKGFtb3VudF8yMDAwcykgfCBhYnMoYW1vdW50XzIwMDBzKSA9PSBJbmYgfCBhbW91bnRfMjAwMHMgPCAwLDAsYW1vdW50XzIwMDBzKSwKICAgICAgICAgICAgICAgICAgIGFtb3VudF8yMDEwcz1pZl9lbHNlKGlzLm5hKGFtb3VudF8yMDEwcykgfCBhYnMoYW1vdW50XzIwMTBzKSA9PSBJbmYgfCBhbW91bnRfMjAxMHMgPCAwLDAsYW1vdW50XzIwMTBzKSkgJT4lCiAgICAgICAgICAgIHNlbGVjdChgQW1vdW50IHBhaWQgMjAwMC0yMDA5YD1hbW91bnRfMjAwMHMsCiAgICAgICAgICAgICAgICAgICBgQW1vdW50IHBhaWQgMjAxMC0yMDE5YD1hbW91bnRfMjAxMHMpICU+JSAjLGBQb3B1bGF0aW9uIGluIHVyYmFuIGFyZWFzYD11cmJhbl9wY3QpICU+JSAKICAgICAgICAgICAgZ2F0aGVyKHZhcmlhYmxlLGxvZzEwX2Ftb3VudCwtZ2VvbWV0cnkpLGFlcyhmaWxsPWxvZzEwX2Ftb3VudCksY29sb3I9TkEpICsKICB2aXJpZGlzOjpzY2FsZV9maWxsX3ZpcmlkaXMoIlRvdGFsIHBhaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb249ImNpdmlkaXMiLGJlZ2luPTAuMixicmVha3M9c2VxKDAsNCxieT0yKSxsYWJlbHM9YygiJDEiLCIkMTAwIiwiJDEwayIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb249MSkgKwogIGZhY2V0X3dyYXAofnZhcmlhYmxlLG5yb3c9MSkgKwogIGxhYnMoY2FwdGlvbj0iRGF0YTogTmF0aW9uYWwgRmxvb2QgSW5zdXJhbmNlIFByb2dyYW0gKGZlbWEuZ292L25hdGlvbmFsLWZsb29kLWluc3VyYW5jZS1wcm9ncmFtKSIpICsKICBnZ3RpdGxlKHBhc3RlMCgiUGVyIGNhcGl0YSBmbG9vZCBjbGFpbXMgcGFpZCBieSB0aGUgTmF0aW9uYWwgRmxvb2QgSW5zdXJhbmNlIFByb2dyYW0gKCIsCiAgICAgICAgICAgICAgICAgZm9ybWF0KHN1bSghaXMubmEodXNfY291bnRpZXNfZGF0YSRhbW91bnRfMjAwMHMpKSxiaWcubWFyaz0iLCIpLCIgY291bnRpZXMpIikpICsKICB0aGVtZShzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTExKSxwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KHNpemU9MTApLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X2JsYW5rKCksYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSkKcHJpbnQocF9mbG9vZCkKYGBgCgoKYGBge3Igd2lsZGZpcmVfbWFwLGVjaG89RkFMU0UsZmlnLndpZHRoPTcsZmlnLmhlaWdodD00LjV9CnBfd2lsZGZpcmUgPC0gZ2dwbG90KCkgKyAKICBnZW9tX3NmKGRhdGE9dXNfY291bnRpZXNfZGF0YSAlPiUgCiAgICAgICAgICAgIG11dGF0ZSh3aWxkZmlyZV9yaXNrPWZhY3Rvcih3aWxkZmlyZV9yaXNrLGxldmVscz1jKCJMb3ciLCJNZWRpdW0iLCJIaWdoIikpKSAlPiUKICAgICAgICAgICAgc2VsZWN0KGBXaWxkZmlyZSByaXNrYD13aWxkZmlyZV9yaXNrKSwKICAgICAgICAgIGFlcyhmaWxsPWBXaWxkZmlyZSByaXNrYCksY29sb3I9TkEpICsKICBzY2FsZV9maWxsX21hbnVhbCgiUmlzayBsZXZlbCIsdmFsdWVzPWMoJyNmZmVkYTAnLCcjZmViMjRjJywnI2YwM2IyMCcpKSArCiAgIyBmYWNldF93cmFwKH52YXJpYWJsZSxucm93PTEpICsKICBsYWJzKGNhcHRpb249IkRhdGE6IFVTIE5hdHVyYWwgSGF6YXJkcyBJbmRleFxuKG5jZHAuY29sdW1iaWEuZWR1L2xpYnJhcnkvbWFwc21hcHBpbmctcHJvamVjdHMvdXMtbmF0dXJhbC1oYXphcmRzLWluZGV4LykiKSArCiAgZ2d0aXRsZShwYXN0ZTAoIldpbGRmaXJlIHJpc2sgZnJvbSBVUyBOYXR1cmFsIEhhemFyZHMgSW5kZXggKCIsCiAgICAgICAgICAgICAgICAgZm9ybWF0KHN1bSghaXMubmEodXNfY291bnRpZXNfZGF0YSR3aWxkZmlyZV9yaXNrKSksYmlnLm1hcms9IiwiKSwiIGNvdW50aWVzKSIpKSArCiAgdGhlbWUoc3RyaXAudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMSkscGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChzaXplPTEwKSwKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF9ibGFuaygpLGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCkpCnByaW50KHBfd2lsZGZpcmUpCmBgYA==